﻿<?xml version="1.0" encoding="utf-8" ?>

<!--
	Convert a 5-digit zip code into a 2-letter state code.
	
	An ArgumentException is thrown if:
	1. The zip code entered is not a 5-digit number.
	2. The zip code is not found by the Convert function.
-->

<Object>
	<Object.Parameters>
		<Parameter Name="zipCode" Type="String" />
	</Object.Parameters>
	<Object.Body>
		<Block>
			<Block.Variables>
				<Parameter Name="zip2" Type="Int32" />
				<Parameter Name="zip3" Type="Int32" />
			</Block.Variables>
			<Block.Expressions>
				<Assign Left="{self.VerifyZipCode}">
					<Assign.Right>
						<Lambda Parameters="{zipCode}">
							<Lambda.Body>
								<Block>
									<Block.Expressions>
										<If Test="{zipCode.Length!=5}" Type="Void">
											<If.True>
												<Throw Type="ArgumentException">
													<Throw.Operand>
														<New Type="ArgumentException" />
													</Throw.Operand>
												</Throw>
											</If.True>
										</If>
										<Call Name="Int32.Parse" Arguments="{zipCode}" />
									</Block.Expressions>
								</Block>
							</Lambda.Body>
						</Lambda>
					</Assign.Right>
				</Assign>

				<Call Name="{self.VerifyZipCode}" Arguments="{zipCode}" />

				<Assign Left="{zip2}">
					<Assign.Right>
						<Call Name="Int32.Parse">
							<Call.Arguments>
								<Call Object="{zipCode}" Name="Substring" Arguments="{0},{2}" />
							</Call.Arguments>
						</Call>
					</Assign.Right>
				</Assign>

				<Assign Left="{zip3}">
					<Assign.Right>
						<Call Name="Int32.Parse">
							<Call.Arguments>
								<Call Object="{zipCode}" Name="Substring" Arguments="{0},{3}" />
							</Call.Arguments>
						</Call>
					</Assign.Right>
				</Assign>

				<If Test="{zip3&gt;=10&amp;&amp;zip3&lt;=27}"><If.True><Return Value="{'MA'}" Target="{Return}" /></If.True></If>
				<If Test="{zip3&gt;=28&amp;&amp;zip3&lt;=29}"><If.True><Return Value="{'RI'}" Target="{Return}" /></If.True></If>
				<If Test="{zip3&gt;=30&amp;&amp;zip3&lt;=38}"><If.True><Return Value="{'NH'}" Target="{Return}" /></If.True></If>
				<If Test="{zip3&gt;=39&amp;&amp;zip3&lt;=49}"><If.True><Return Value="{'ME'}" Target="{Return}" /></If.True></If>
				<If Test="{zip3&gt;=150&amp;&amp;zip3&lt;=196}"><If.True><Return Value="{'PA'}" Target="{Return}" /></If.True></If>
				<If Test="{zip3&gt;=197&amp;&amp;zip3&lt;=199}"><If.True><Return Value="{'DE'}" Target="{Return}" /></If.True></If>
				<If Test="{zip3&gt;=200&amp;&amp;zip3&lt;=205}"><If.True><Return Value="{'DC'}" Target="{Return}" /></If.True></If>
				<If Test="{zip3&gt;=206&amp;&amp;zip3&lt;=219}"><If.True><Return Value="{'MD'}" Target="{Return}" /></If.True></If>
				<If Test="{zip3&gt;=220&amp;&amp;zip3&lt;=246}"><If.True><Return Value="{'VA'}" Target="{Return}" /></If.True></If>
				<If Test="{zip3&gt;=247&amp;&amp;zip3&lt;=269}"><If.True><Return Value="{'WV'}" Target="{Return}" /></If.True></If>
				<If Test="{zip3&gt;=370&amp;&amp;zip3&lt;=385}"><If.True><Return Value="{'TN'}" Target="{Return}" /></If.True></If>
				<If Test="{zip3&gt;=386&amp;&amp;zip3&lt;=399}"><If.True><Return Value="{'MS'}" Target="{Return}" /></If.True></If>
				<If Test="{zip3&gt;=550&amp;&amp;zip3&lt;=567}"><If.True><Return Value="{'MN'}" Target="{Return}" /></If.True></If>
				<If Test="{zip3&gt;=700&amp;&amp;zip3&lt;=715}"><If.True><Return Value="{'LA'}" Target="{Return}" /></If.True></If>
				<If Test="{zip3&gt;=716&amp;&amp;zip3&lt;=729}"><If.True><Return Value="{'AR'}" Target="{Return}" /></If.True></If>
				<If Test="{zip3&gt;=820&amp;&amp;zip3&lt;=831}"><If.True><Return Value="{'WY'}" Target="{Return}" /></If.True></If>
				<If Test="{zip3&gt;=832&amp;&amp;zip3&lt;=839}"><If.True><Return Value="{'ID'}" Target="{Return}" /></If.True></If>
				<If Test="{zip3&gt;=870&amp;&amp;zip3&lt;=884}"><If.True><Return Value="{'NM'}" Target="{Return}" /></If.True></If>
				<If Test="{zip3&gt;=889&amp;&amp;zip3&lt;=899}"><If.True><Return Value="{'NV'}" Target="{Return}" /></If.True></If>
				<If Test="{zip3&gt;=900&amp;&amp;zip3&lt;=961}"><If.True><Return Value="{'CA'}" Target="{Return}" /></If.True></If>
				<If Test="{zip3&gt;=967&amp;&amp;zip3&lt;=968}"><If.True><Return Value="{'HI'}" Target="{Return}" /></If.True></If>
				<If Test="{zip3&gt;=980&amp;&amp;zip3&lt;=994}"><If.True><Return Value="{'WA'}" Target="{Return}" /></If.True></If>
				<If Test="{zip3&gt;=995&amp;&amp;zip3&lt;=999}"><If.True><Return Value="{'AK'}" Target="{Return}" /></If.True></If>

				<If Test="{zip2==5}"><If.True><Return Value="{'VT'}" Target="{Return}" /></If.True></If>
				<If Test="{zip2==6}"><If.True><Return Value="{'CT'}" Target="{Return}" /></If.True></If>
				<If Test="{zip2&gt;=7&amp;&amp;zip2&lt;=8}"><If.True><Return Value="{'NJ'}" Target="{Return}" /></If.True></If>
				<If Test="{zip2&gt;=10&amp;&amp;zip2&lt;=14}"><If.True><Return Value="{'NY'}" Target="{Return}" /></If.True></If>
				<If Test="{zip2&gt;=27&amp;&amp;zip2&lt;=28}"><If.True><Return Value="{'NC'}" Target="{Return}" /></If.True></If>
				<If Test="{zip2==29}"><If.True><Return Value="{'SC'}" Target="{Return}" /></If.True></If>
				<If Test="{zip2&gt;=30&amp;&amp;zip2&lt;=31}"><If.True><Return Value="{'GA'}" Target="{Return}" /></If.True></If>
				<If Test="{zip2&gt;=32&amp;&amp;zip2&lt;=34}"><If.True><Return Value="{'FL'}" Target="{Return}" /></If.True></If>
				<If Test="{zip2&gt;=35&amp;&amp;zip2&lt;=36}"><If.True><Return Value="{'AL'}" Target="{Return}" /></If.True></If>
				<If Test="{zip2&gt;=40&amp;&amp;zip2&lt;=42}"><If.True><Return Value="{'KY'}" Target="{Return}" /></If.True></If>
				<If Test="{zip2&gt;=43&amp;&amp;zip2&lt;=45}"><If.True><Return Value="{'OH'}" Target="{Return}" /></If.True></If>
				<If Test="{zip2&gt;=46&amp;&amp;zip2&lt;=47}"><If.True><Return Value="{'IN'}" Target="{Return}" /></If.True></If>
				<If Test="{zip2&gt;=48&amp;&amp;zip2&lt;=49}"><If.True><Return Value="{'MI'}" Target="{Return}" /></If.True></If>
				<If Test="{zip2&gt;=50&amp;&amp;zip2&lt;=52}"><If.True><Return Value="{'IA'}" Target="{Return}" /></If.True></If>
				<If Test="{zip2&gt;=53&amp;&amp;zip2&lt;=54}"><If.True><Return Value="{'WI'}" Target="{Return}" /></If.True></If>
				<If Test="{zip2==57}"><If.True><Return Value="{'SD'}" Target="{Return}" /></If.True></If>
				<If Test="{zip2==58}"><If.True><Return Value="{'ND'}" Target="{Return}" /></If.True></If>
				<If Test="{zip2==59}"><If.True><Return Value="{'MT'}" Target="{Return}" /></If.True></If>
				<If Test="{zip2&gt;=60&amp;&amp;zip2&lt;=62}"><If.True><Return Value="{'IL'}" Target="{Return}" /></If.True></If>
				<If Test="{zip2&gt;=63&amp;&amp;zip2&lt;=65}"><If.True><Return Value="{'MO'}" Target="{Return}" /></If.True></If>
				<If Test="{zip2&gt;=66&amp;&amp;zip2&lt;=67}"><If.True><Return Value="{'KS'}" Target="{Return}" /></If.True></If>
				<If Test="{zip2&gt;=68&amp;&amp;zip2&lt;=69}"><If.True><Return Value="{'NE'}" Target="{Return}" /></If.True></If>
				<If Test="{zip2&gt;=73&amp;&amp;zip2&lt;=74}"><If.True><Return Value="{'OK'}" Target="{Return}" /></If.True></If>
				<If Test="{zip2&gt;=75&amp;&amp;zip2&lt;=79}"><If.True><Return Value="{'TX'}" Target="{Return}" /></If.True></If>
				<If Test="{zip2&gt;=80&amp;&amp;zip2&lt;=81}"><If.True><Return Value="{'CO'}" Target="{Return}" /></If.True></If>
				<If Test="{zip2==84}"><If.True><Return Value="{'VT'}" Target="{Return}" /></If.True></If>
				<If Test="{zip2&gt;=85&amp;&amp;zip2&lt;=86}"><If.True><Return Value="{'AZ'}" Target="{Return}" /></If.True></If>
				<If Test="{zip2==97}"><If.True><Return Value="{'OR'}" Target="{Return}" /></If.True></If>

				<Throw Type="ArgumentException">
					<Throw.Operand>
						<New Type="ArgumentException" Arguments="{'Invalid zip code.'},{zipCode}" />
					</Throw.Operand>
				</Throw>

				<Label Default="{'N/A'}">
					<Label.Target>
						<LabelTarget Name="Return" Type="String" />
					</Label.Target>
				</Label>
			</Block.Expressions>
		</Block>
	</Object.Body>
</Object>